home *** CD-ROM | disk | FTP | other *** search
/ 17 Bit Software 6: Level 6 / 17 Bit - Level 6 (1998)(Epic Marketing)[!].iso / !applications! / quadra_comp.v2.03 / qcfastreplay.s next >
Text File  |  1996-09-07  |  7KB  |  335 lines

  1. * This replayroutine was written by Bo Lincoln (Eternal).
  2. * Copyright © 1993 Technological Artwork. All rights reserved.
  3. * You may use this routine in your programs.
  4. * This is the fast-routine, i.e it uses level 6 interrupt to wait for
  5. * the dma. Worst case is about 8 rasterlines (tested with an average module).
  6. * How to use: Call QC_init to init the mod.
  7. *             Call QC_music every vertical blank.
  8. *             Call QC_end to stop.
  9. *             The EMOD should be at QC_data.
  10. * You can not use Tempo in this routine. (Then you have to put the whole
  11. * routine in the level 6 interrupt).
  12.               
  13.  
  14. QC_dmawait = 255
  15.  
  16. cia_CRA = $e00
  17. cia_ICR = $d00
  18. cia_TALO = $400
  19. cia_TAHI = $500
  20.  
  21.     section QC,code_c
  22. s:    move.w $dff01c,-(sp)
  23.     move.w #$7fff,$dff09a            ;Turn off all interrupts
  24.     bsr QC_init
  25. loop:    bsr QC_music
  26. loop2:    cmp.b #70,$dff006
  27.     bne loop2
  28. loop3:    cmp.b #70,$dff006
  29.     beq loop3
  30.     btst #6,$bfe001
  31.     bne loop
  32.     bsr QC_end
  33.     move.w (sp)+,d0
  34.     or.w #$8000,d0
  35.     move.w d0,$dff09a
  36.     rts
  37.  
  38. QC_init:lea QC_data(pc),a0        ;Check if the module is ok
  39.     cmp.l #"FORM",(a0)
  40.     bne QC_initerr
  41.     cmp.l #"EMOD",8(a0)
  42.     bne QC_initerr
  43.     cmp.l #"EMIC",12(a0)
  44.     bne QC_initerr
  45.     cmp.w #1,20(a0)
  46.     bne QC_initerr
  47.  
  48.     or.b #$2,$bfe001
  49.     moveq #0,d7        ;Get the adresses to the sampleinfos
  50.     move.b 63(a0),d7    ;and init the real adresses in the infos
  51.     subq #1,d7
  52.     lea 64(a0),a0
  53.     lea QC_samplepointers(pc),a1
  54. QC_sploop:moveq #0,d0
  55.     move.b (a0),d0
  56.     add.w d0,d0
  57.     add.w d0,d0
  58.     move.l a0,(a1,d0.w)
  59.     add.l #QC_data,30(a0)
  60.     move.l 30(a0),a2
  61.     clr.w (a2)
  62.     lea 34(a0),a0
  63.     dbf d7,QC_sploop
  64.  
  65.     lea QC_patternpointers(pc),a1    ;Get the patternadresses
  66.     moveq #0,d7
  67.     addq #1,a0
  68.     move.b (a0)+,d7
  69.     subq #1,d7
  70. QC_pploop:moveq #0,d0
  71.     move.b (a0),d0
  72.     add.w d0,d0
  73.     add.w d0,d0
  74.     move.l a0,(a1,d0.w)
  75.     add.l #QC_data,22(a0)
  76.     lea 26(a0),a0
  77.     dbf d7,QC_pploop
  78.  
  79.     move.l $78,QC_oldIrq
  80.     clr.w QC_nrofpos
  81.     move.b (a0)+,QC_nrofpos+1    
  82.     move.l a0,QC_posstart
  83.     moveq #0,d0
  84.     move.b (a0),d0
  85.     add.w d0,d0
  86.     add.w d0,d0
  87.     move.l (a1,d0.w),a1
  88.     move.l 22(a1),QC_currpattpointer    
  89.     move.b 1(a1),QC_breakrow+1
  90.     move.w #6,QC_speed
  91.     move.w QC_speed(pc),QC_speedcount
  92.     clr.b QC_newposflag
  93.     clr.w QC_rowcount
  94.     clr.w QC_pos
  95.     move.w #1,t_length+QC_chan1
  96.     move.w #1,t_length+QC_chan2
  97.     move.w #1,t_length+QC_chan3
  98.     move.w #1,t_length+QC_chan4
  99.     move.w #1,t_replen+QC_chan1
  100.     move.w #1,t_replen+QC_chan2
  101.     move.w #1,t_replen+QC_chan3
  102.     move.w #1,t_replen+QC_chan4
  103.     moveq #0,d0
  104. QC_end:    move.b #$7f,$bfd000+cia_ICR
  105.     move.w #$2000,$dff09a
  106.     move.w #$2000,$dff09c
  107.     move.l QC_oldirq,$78
  108.     move.w #$f,$dff096
  109.     clr.w $dff0a8
  110.     clr.w $dff0b8
  111.     clr.w $dff0c8
  112.     clr.w $dff0d8
  113.     rts        
  114. QC_initerr:moveq #-1,d0
  115.     rts
  116.  
  117. QC_music:
  118.     addq.w #1,QC_speedcount
  119.     move.w QC_speed,d0
  120.     cmp.w QC_speedcount,d0
  121.     bgt QC_nonew
  122.     tst.b QC_pattwait
  123.     beq QC_getnotes
  124.     subq.b #1,QC_pattwait
  125.     clr.w QC_speedcount
  126.  
  127. QC_nonew:lea QC_samplepointers(pc),a4
  128.     lea QC_periodtable(pc),a3
  129.     lea QC_chan1(pc),a6
  130.     lea $dff0a0,a5
  131.     bsr QC_chkplayfx
  132.     lea QC_chan2-QC_chan1(a6),a6
  133.     lea $10(a5),a5
  134.     bsr QC_chkplayfx
  135.     lea QC_chan2-QC_chan1(a6),a6
  136.     lea $10(a5),a5
  137.     bsr QC_chkplayfx
  138.     lea QC_chan2-QC_chan1(a6),a6
  139.     lea $10(a5),a5    
  140.     bsr QC_chkplayfx
  141.  
  142.     move.w QC_dmacon(pc),$dff096
  143.     beq QC_mend
  144.  
  145.     lea $bfd000,a0
  146.     move.b #$7f,cia_ICR(a0)
  147.     move.w #$2000,$dff09c
  148.     move.l #QC_setdma,$78.w
  149.     move.w #$e000,$dff09a
  150.     clr.b cia_CRA(a0)
  151.     move.b #QC_dmawait,cia_TALO(a0)
  152.     clr.b cia_TAHI(a0)
  153.     move.b #$11,cia_CRA(a0)
  154.     move.b #$81,cia_ICR(a0)
  155.     rts    
  156.  
  157. QC_chkplayfx:
  158.     lea QC_playfx(pc),a2
  159.     move.b t_cmd(a6),d0
  160.     and.w #$f,d0
  161.     add.w d0,d0    
  162.     add.w d0,d0    
  163.     move.l (a2,d0.w),a0
  164.     jmp (a0)    
  165.     
  166. QC_getnotes:
  167.     clr.w QC_speedcount
  168.     move.l QC_currpattpointer(pc),a0
  169.     move.w QC_rowcount(pc),d0
  170.     asl.w #4,d0
  171.     add.w d0,a0
  172.     lea QC_samplepointers(pc),a4
  173.     lea QC_periods(pc),a3
  174.     
  175.     lea $dff0a0,a5
  176.     lea QC_chan1(pc),a6
  177.     bsr QC_playnote
  178.     lea $10(a5),a5
  179.     lea QC_chan2-QC_chan1(a6),a6
  180.     bsr QC_playnote
  181.     lea $10(a5),a5
  182.     lea QC_chan2-QC_chan1(a6),a6
  183.     bsr QC_playnote
  184.     lea $10(a5),a5
  185.     lea QC_chan2-QC_chan1(a6),a6
  186.     bsr QC_playnote
  187.  
  188.     move.w QC_dmacon(pc),$dff096
  189.     beq QC_update
  190.  
  191.     lea $bfd000,a0
  192.     move.b #$7f,cia_ICR(a0)
  193.     move.w #$2000,$dff09c
  194.     move.w #$e000,$dff09a
  195.     move.l #QC_setdma,$78.w
  196.     clr.b cia_CRA(a0)
  197.     move.b #QC_dmawait,cia_TALO(a0)
  198.     clr.b cia_TAHI(a0)
  199.     move.b #$11,cia_CRA(a0)
  200.     move.b #$81,cia_ICR(a0)
  201.     
  202. QC_update:
  203. QC_tstnewpos:tst.b QC_newposflag
  204.     beq QC_tstend
  205.     clr.b QC_newposflag
  206.     move.w QC_newposnr,QC_pos
  207.     bra QC_newpos
  208. QC_tstend:tst.b QC_jumpbreakflag
  209.     beq QC_tstend2
  210.     clr.b QC_jumpbreakflag
  211.     move.w QC_looprow(pc),d0
  212.     cmp.w QC_breakrow(pc),d0
  213.     bgt QC_mend
  214.     move.w d0,QC_rowcount
  215.     rts
  216. QC_tstend2:    
  217.     addq.w #1,QC_rowcount
  218.     move.w QC_rowcount(pc),d0
  219.     cmp.w QC_breakrow(pc),d0
  220.     ble QC_mend
  221.     addq.w #1,QC_pos
  222. QC_newpos:move.w QC_pos(pc),d0
  223.     cmp.w QC_nrofpos(pc),d0
  224.     blt QC_getpos
  225.     clr.w QC_pos
  226.     moveq #0,d0
  227. QC_getpos:move.l QC_posstart(pc),a0
  228.     move.b (a0,d0.w),d0
  229.     add.w d0,d0
  230.     add.w d0,d0
  231.     lea QC_patternpointers(pc),a0
  232.     move.l (a0,d0.w),a0
  233.     move.l 22(a0),QC_currpattpointer
  234.     move.b 1(a0),QC_breakrow+1
  235.     move.w QC_newrow(pc),QC_rowcount
  236.     clr.w QC_newrow
  237. QC_mend:rts
  238.  
  239. QC_setDMA:
  240.     tst.b $bfd000+cia_ICR
  241.     or.w #$8000,QC_dmacon
  242.     move.w QC_dmacon(pc),$dff096
  243.     clr.w QC_dmacon
  244.     move.l #QC_fixloop,$78.w
  245.     move.w #$2000,$dff09c
  246.     rte
  247.  
  248. QC_fixloop:    
  249.     tst.b $bfd000+cia_ICR
  250.     move.l a5,-(sp)
  251.     move.l a0,-(sp)
  252.     lea $dff000,a5
  253.     lea QC_chan1+t_repeat(pc),a0
  254.     move.l (a0),$a0(a5)    
  255.     move.w 4(a0),$a4(a5)
  256.     move.l QC_chan2-QC_chan1(a0),$b0(a5)    
  257.     move.w 4+QC_chan2-QC_chan1(a0),$b4(a5)
  258.     move.l QC_chan3-QC_chan1(a0),$c0(a5)    
  259.     move.w 4+QC_chan3-QC_chan1(a0),$c4(a5)
  260.     move.l QC_chan4-QC_chan1(a0),$d0(a5)    
  261.     move.w 4+QC_chan4-QC_chan1(a0),$d4(a5)
  262.     clr.b $bfd000+cia_CRA
  263.     move.b #$7f,$bfd000+cia_ICR
  264.     move.w #$2000,$dff09a
  265.     move.w #$2000,$dff09c
  266.     move.l (sp)+,a0
  267.     move.l (sp)+,a5
  268.     rte    
  269.     
  270. QC_playnote:move.l (a0)+,(a6)
  271.     moveq #0,d0
  272.     move.b (a6),d0
  273.     beq QC_isnote
  274.     add.w d0,d0
  275.     add.w d0,d0
  276.     move.l (a4,d0.w),a1
  277.     move.b 1(a1),t_volume+1(a6)
  278.     move.b 25(a1),d0
  279.     and.w #$f,d0
  280.     add.w d0,d0
  281.     add.w d0,d0
  282.     move.l (a3,d0.w),t_finetune(a6)
  283.     move.l 30(a1),d1
  284.     move.l d1,t_start(a6)
  285.     move.w t_volume(a6),8(a5)
  286.     btst #0,24(a1)
  287.     beq QC_noloop
  288.     moveq #0,d0
  289.     move.w 26(a1),d0
  290.     add.l d0,d1
  291.     add.l d0,d1
  292.     move.l d1,t_repeat(a6)
  293.     moveq #0,d0
  294.     move.w 26(a1),d0
  295.     moveq #0,d1
  296.     move.w 28(a1),d1
  297.     add.l d0,d1
  298.     move.w d1,t_length(a6)
  299.     move.w 28(a1),t_replen(a6)
  300.     bra QC_isnote
  301. QC_noloop:clr.l t_repeat(a6)
  302.     move.w #$1,t_replen(a6)
  303.     move.w 2(a1),t_length(a6)
  304. QC_isnote:
  305.     tst.b t_notenr(a6)
  306.     blt QC_chkfirstfx
  307.     move.b t_notenr(a6),t_notenr2+1(a6)
  308.     move.w t_cmd(a6),d0
  309.     and.w #$ff0,d0
  310.     cmp.w #$e50,d0
  311.     beq QC_setfinetunefirst
  312.     and.w #$f00,d0
  313.     cmp.w #$300,d0
  314.     beq QC_settoneport
  315.     cmp.w #$500,d0
  316.     beq QC_settoneport
  317. QC_getper:move.w t_notenr2(a6),d0
  318.     add.w d0,d0
  319.     move.l t_finetune(a6),a2
  320.     move.w (a2,d0.w),t_period(a6)
  321.     move.w t_cmd(a6),d0
  322.     and.w #$ff0,d0
  323.     cmp.w #$ed0,d0
  324.     beq QC_notedelay
  325.     move.w t_dmabit(a6),d0
  326.     or.w d0,QC_dmacon
  327.     move.l t_start(a6),(a5)
  328.     move.w t_length(a6),4(a5)
  329.     move.w t_period(a6),6(a5)
  330. QC_chkfirstfx:
  331.     lea QC_fxaftersetperiod(pc),a2
  332.     moveq #0,d0
  333.     move.b t_cmd(a6),d0
  334.     add.w d0,d0
  335.     add.w d0,